﻿using System;
using System.Collections.Generic;
using System.Text;

namespace Modelo
{
    [Serializable]
    public class Bombita : Personaje
    {

        private int cantVidas;
        private int velInicial;
        private int modificadorRetardo;

        public Bombita(Posicion posInicial, int tamanio, Mapa mapaActual)
            : base(posInicial, tamanio, mapaActual)
        {
            this.modificadorRetardo = 0; //No agarrro el timer todavia.
            cantVidas = 3; //cantidad de vidas inicial
            velInicial = velActual; //Puede ser un parametro tambien.
            bomba = typeof(Molotov);//(retardo, expansion, destruccion)
        }

        public int getVidasRestantes()
        {
            return cantVidas;
        }

        public void perderVida()
        {
            cantVidas--;
        }

        public Type getBomba()
        {
            return bomba;
        }

        public int getVelActual()
        {
            return velActual;
        }

        public int getVelInicial()
        {
            return velInicial;
        }

        public void setEnMapaYPosicion(Mapa nuevoMapa, Posicion nuevaPos)
        {
            mapa = nuevoMapa;
            posicion = nuevaPos;
        }

        #region IColisionable Members

        public override void recibirColision(IColisionable elOtro)
        {
            elOtro.manejarColisionCon(this);
        }

        public override void manejarColisionCon(Bombita elOtro)
        {
            //Bombita no puede colisionar con si mismo. No deberia haber otra instancia de Bombita. Tirar excepcion.
            throw new NotImplementedException();
        }

        public override void manejarColisionCon(Enemigo elOtro)
        {
            //Bombita pierda una vida y reiniciar el nivel.
            perderVida();
            mapa.reiniciarNivel(mapa);
        }

        public override void manejarColisionCon(PowerUp elOtro)
        {
            elOtro.serAgarrado(this);
        }

        public override void manejarColisionCon(Bomba elOtro)
        {
            //No debe poder caminar por encima.
        }

        #endregion

        public void cambiarBomba(Type nuevaBomba)
        {
            bomba = nuevaBomba;
        }


        public void setModificadorRetardo(int disminucionRetardo)
        {
            this.modificadorRetardo = disminucionRetardo;
        }

        public int getModificadorRetardo()
        {
            return this.modificadorRetardo;
        }

        public override void plantarBomba()
        {
            foreach (IColisionable obstaculo in mapa.obtenerObstaculos())
            {
                if (obstaculo.getPosX() == posicion.getX() && obstaculo.getPosY() == posicion.getY())
                    return;
            }
            Posicion posicionBomba = mapa.obtenerPosicionCentroDeCelda(this.posicion);
            Type[] tiposParametro = { typeof(Posicion), typeof(Mapa) };
            Object[] parametros = { (Object)posicionBomba, (Object)this.mapa };
            Bomba nuevaBomba = (Bomba)bomba.GetConstructor(tiposParametro).Invoke(parametros);
            nuevaBomba.disminuirRetardo(this.modificadorRetardo);
            mapa.agregarObstaculo(nuevaBomba);
        }
    }
}
